package com.example.myapplication;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 头像管理工具类
 * 负责头像的存储、加载和删除，确保用户数据隔离和隐私安全
 */
public class AvatarManager {
    private static final String TAG = "AvatarManager";
    private static final String AVATAR_DIR = "avatars"; // 头像存储目录
    private static final String AVATAR_PREFIX = "avatar_"; // 头像文件前缀
    private static final String AVATAR_SUFFIX = ".jpg"; // 头像文件后缀
    private static final int MAX_WIDTH = 500; // 压缩后的最大宽度
    private static final int MAX_HEIGHT = 500; // 压缩后的最大高度
    
    private final Context context;
    
    public AvatarManager(Context context) {
        this.context = context.getApplicationContext();
    }
    
    /**
     * 保存用户头像到应用私有目录
     * @param userId 用户唯一标识（用于数据隔离）
     * @param imageUri 图片URI
     * @return 是否保存成功
     */
    public boolean saveAvatar(String userId, Uri imageUri) {
        try {
            // 1. 从URI读取图片
            InputStream inputStream = context.getContentResolver().openInputStream(imageUri);
            if (inputStream == null) {
                Log.e(TAG, "无法打开图片URI");
                return false;
            }
            
            // 2. 解码图片并压缩
            Bitmap originalBitmap = BitmapFactory.decodeStream(inputStream);
            inputStream.close();
            
            if (originalBitmap == null) {
                Log.e(TAG, "图片解码失败");
                return false;
            }
            
            Bitmap compressedBitmap = compressBitmap(originalBitmap);
            
            // 3. 删除旧头像（隐私保护：不残留历史数据）
            deleteAvatar(userId);
            
            // 4. 创建头像存储目录
            File avatarDir = new File(context.getFilesDir(), AVATAR_DIR);
            if (!avatarDir.exists()) {
                avatarDir.mkdirs();
            }
            
            // 5. 保存新头像到应用私有目录
            File avatarFile = getAvatarFile(userId);
            FileOutputStream outputStream = new FileOutputStream(avatarFile);
            compressedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);
            outputStream.flush();
            outputStream.close();
            
            // 6. 释放资源
            originalBitmap.recycle();
            compressedBitmap.recycle();
            
            Log.d(TAG, "头像保存成功: " + avatarFile.getAbsolutePath());
            return true;
            
        } catch (IOException e) {
            Log.e(TAG, "保存头像失败", e);
            return false;
        }
    }
    
    /**
     * 加载用户头像
     * @param userId 用户唯一标识
     * @return Bitmap对象，若不存在则返回null
     */
    public Bitmap loadAvatar(String userId) {
        File avatarFile = getAvatarFile(userId);
        if (avatarFile.exists()) {
            return BitmapFactory.decodeFile(avatarFile.getAbsolutePath());
        }
        return null;
    }
    
    /**
     * 删除用户头像
     * @param userId 用户唯一标识
     * @return 是否删除成功
     */
    public boolean deleteAvatar(String userId) {
        File avatarFile = getAvatarFile(userId);
        if (avatarFile.exists()) {
            boolean deleted = avatarFile.delete();
            Log.d(TAG, "删除旧头像: " + deleted);
            return deleted;
        }
        return true;
    }
    
    /**
     * 检查用户是否设置过头像
     * @param userId 用户唯一标识
     * @return 是否存在自定义头像
     */
    public boolean hasAvatar(String userId) {
        return getAvatarFile(userId).exists();
    }
    
    /**
     * 获取头像文件路径
     * @param userId 用户唯一标识
     * @return 头像文件对象
     */
    private File getAvatarFile(String userId) {
        File avatarDir = new File(context.getFilesDir(), AVATAR_DIR);
        return new File(avatarDir, AVATAR_PREFIX + userId + AVATAR_SUFFIX);
    }
    
    /**
     * 压缩Bitmap以节省存储空间
     * @param original 原始Bitmap
     * @return 压缩后的Bitmap
     */
    private Bitmap compressBitmap(Bitmap original) {
        int width = original.getWidth();
        int height = original.getHeight();
        
        // 如果图片尺寸小于最大值，直接返回
        if (width <= MAX_WIDTH && height <= MAX_HEIGHT) {
            return original;
        }
        
        // 计算缩放比例
        float scale = Math.min((float) MAX_WIDTH / width, (float) MAX_HEIGHT / height);
        int newWidth = (int) (width * scale);
        int newHeight = (int) (height * scale);
        
        return Bitmap.createScaledBitmap(original, newWidth, newHeight, true);
    }
}
